home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ML_BME1.ZIP / DISTORT / DIST1_V1.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-12-21  |  3.9 KB  |  194 lines

  1. {
  2.  4-waves distortion of a 320x200 bitmap
  3.  by Maple Leaf, 1996
  4.  ------------------------------------------------------------------------
  5.  "version" 1 - using Pascal's floating point - terribly slow!
  6.  
  7.  Do whatever you want with this code, but if you intend to use any parts of
  8.  it, please credit me - say "hello Maple Leaf" or something, and this should
  9.  be quite enough...
  10. }
  11. uses alloc, dosio, bitmap;
  12.  
  13. var vScr, Temp : word;
  14.     Img : pointer;
  15.     Pal : array[byte] of record r,g,b:byte end;
  16.  
  17.     Wave1, Wave2 : array [0..199] of integer;  { Left/Right }
  18.     Wave3, Wave4 : array [0..319] of integer;  { Up/Down }
  19.  
  20. procedure InitVideo;near;assembler;
  21. asm
  22.   mov ax,13h
  23.   int 10h  { init video mode }
  24.   mov dx,3c8h
  25.   mov al,0
  26.   out dx,al
  27.   inc dx
  28.   mov cx,768
  29.   mov si,offset pal
  30.   rep outsb { set palette }
  31. end;
  32.  
  33. procedure vWait;near;assembler;
  34. asm
  35.     mov dx,3DAh
  36. @1: in al,dx
  37.     test al,8
  38.     jne @1
  39. @2: in al,dx
  40.     test al,8
  41.     je @2
  42. end;
  43.  
  44. procedure ShowVScreen;near;assembler;
  45. asm
  46.   push ds
  47.   push es
  48.   mov cx,16000
  49.   mov ax,0A000h
  50.   mov es,ax
  51.   mov di,0
  52.   mov si,di
  53.   mov ds,VScr
  54.   cld
  55.   db 66h; rep movsw
  56.   pop es
  57.   pop ds
  58. end;
  59.  
  60. procedure freeAll;
  61. begin
  62.   free(img);
  63.   hfree(vScr);
  64.   hfree(Temp);
  65. end;
  66.  
  67. procedure InitData;
  68. begin
  69.   vScr:=halloc(64000);
  70.   Temp:=halloc(64000);
  71.   Img:=LoadPCX(paramstr(1),@pal);
  72.   if (Img=nil) or (vScr=0) or (Temp=0) then begin
  73.     freeAll;
  74.     asm mov ax,3; int 10h end;
  75.     writeln('Not enough memory');
  76.     halt
  77.   end;
  78. end;
  79.  
  80. var ang : word;
  81.  
  82. procedure UpdateWaves;  { update the four waves (left/right/up/down) }
  83. const MaxAmpl = 40;
  84.       MA = MaxAmpl div 2;
  85. var k:word;
  86. begin
  87.   inc(ang,5);
  88.   for k:=0 to 199 do begin
  89.     Wave1[k]:=trunc(MA+MA*sin(2*(k+ang)*pi/180)*cos(8*(k+ang)*pi/180));{}
  90.     Wave2[k]:=trunc(MA+MA*cos(8*(k+ang)*pi/180)*sin(4*(k+ang)*pi/180));{}
  91.   end;
  92.   for k:=0 to 319 do begin
  93.     Wave3[k]:=trunc(MA+MA*sin(8*(k+ang)*pi/180)*sin(2*(k+ang)*pi/180));{}
  94.     Wave4[k]:=trunc(MA+MA*cos(1*(k+ang)*pi/180)*cos(8*(k+ang)*pi/180));{}
  95.   end;
  96. end;
  97.  
  98. procedure DistortLine(k:word);
  99. var XStart, XEnd, NewXSize, sOffs, dOffs, j : word;
  100.     xAddF,xx : real;
  101.     byt:byte;
  102. procedure stosb;
  103. begin
  104.   mem[temp:dOffs]:=byt; {!!!!!}
  105.   inc(dOffs);
  106. end;
  107. begin
  108.   XStart:=Wave1[k];
  109.   XEnd:=319-Wave2[k];
  110.   NewXSize:=XEnd-XStart+1;
  111.   xAddF:=320/NewXSize;
  112.   xx:=0;
  113.   sOffs:=k*320;
  114.   dOffs:=sOffs;
  115.   { do the left black area }
  116.   byt:=0;
  117.   for j:=1 to xStart do stosb;
  118.   { distort the line }
  119.   for j:=1 to NewXSize do begin
  120.     byt:=mem[seg(Img^):sOffs+round(xx)];  { !!! use ROUND, not TRUNC !!! }
  121.     stosb;
  122.     xx:=xx+xAddF;
  123.   end;
  124.   { do the right black area }
  125.   byt:=0;
  126.   for k:=1 to (319-xEnd) do stosb;
  127. end;
  128.  
  129. procedure HoriDistort;
  130. var k:word;
  131. begin
  132.   for k:=0 to 199 do DistortLine(k);
  133. end;
  134.  
  135. procedure DistortCol(k:word);
  136. var yStart, yEnd, NewYSize, j : word;
  137.     yAddF, yy : real;
  138.     byt:byte;
  139.     dOffs, sOffs : word;
  140. procedure stosb;
  141. begin
  142.   mem[vscr:dOffs]:=byt; {!!!!!}
  143.   inc(dOffs,320);
  144. end;
  145. begin
  146.   yStart:=Wave3[k];
  147.   yEnd:=199-Wave4[k];
  148.   NewYSize:=yEnd-yStart+1;
  149.   yAddF:=200/NewYSize;
  150.   yy:=0;
  151.   dOffs:=k;
  152.   { do the left black area }
  153.   byt:=0;
  154.   for j:=1 to yStart do stosb;
  155.   { distort the line }
  156.   for j:=1 to NewYSize do begin
  157.     byt:=mem[temp:k+round(yy)*320];  { !!! use ROUND, not TRUNC !!! }
  158.     stosb;
  159.     yy:=yy+yAddF;
  160.   end;
  161.   { do the right black area }
  162.   byt:=0;
  163.   for k:=1 to (199-yEnd) do stosb;
  164. end;
  165.  
  166. procedure VertDistort;
  167. var k:word;
  168. begin
  169.   for k:=0 to 319 do DistortCol(k);
  170. end;
  171.  
  172. procedure DoIt;
  173. begin
  174.   repeat
  175.     UpdateWaves;
  176.     HoriDistort;
  177.     VertDistort;
  178.     vWait;
  179.     ShowVScreen;
  180.   until port[$60]=1;
  181. end;
  182.  
  183. begin
  184.   if paramcount=0 then begin
  185.     writeln('Parameter expected (FileName.PCX)');
  186.     halt
  187.   end;
  188.   InitData;
  189.   InitVideo;
  190.   DoIt;
  191.   asm mov ax,3; int 10h end;
  192.   freeAll;
  193. end.
  194.